home *** CD-ROM | disk | FTP | other *** search
/ Zoom 2 / Zoom - Release 2 (1996)(Active Software)[!].iso / music / utilities / octamed4devkit / proplayer / loadmod.a next >
Text File  |  1993-06-15  |  7KB  |  244 lines

  1. ;   (Octa)MED module load routines, by Teijo Kinnunen  © Fully Copyrighted
  2. ;   MED V3.00 module support added      22-Jan-1991
  3. ;   upgraded for V3.20 (OctaMED V2.00)  02-Aug-1991
  4. ;   and for OctaMED Pro V3.00       02-Apr-1992
  5. ;   (bug fix)               31-May-1992
  6. ;   OctaMED Pro V5 support (MMD2)       18-May-1993
  7.  
  8. ;   $VER: loadmod_a 5.001 (25.05.1993)
  9.  
  10. ;   Function: d0 = _LoadModule(a0)
  11. ;   a0 = module name
  12. ;   d0 = pointer to loaded module, zero if load failed
  13.  
  14.     XDEF    _LoadModule
  15.     XDEF    _UnLoadModule
  16.     XDEF    _RelocModule
  17.  
  18. mmd_songinfo    EQU 8
  19. mmd_blockarr    EQU 16
  20. mmd_expdata EQU 32
  21. msng_numblocks  EQU 504
  22. msng_pseqs  EQU 508
  23. msng_numsamples EQU 787
  24.  
  25.     CODE
  26. _LoadModule:
  27.         movem.l a2-a4/a6/d2-d6,-(sp)
  28.         moveq   #0,d6       ;d6 = return value (zero = error)
  29.         move.l  a0,a4       ;a4 = module name
  30.         movea.l 4,a6
  31.         lea     dosname(pc),a1
  32.         moveq   #0,d0
  33.         jsr     -$228(a6)   ;OpenLibrary()
  34.         tst.l   d0
  35.         beq     xlm1
  36.         move.l  d0,a3       ;a3 = DOSBase
  37.         move.l  d0,a6
  38.         move.l  a4,d1       ;name = d1
  39.         move.l  #1005,d2    ;accessmode = MODE_OLDFILE
  40.         jsr     -$1e(a6)    ;Open()
  41.         move.l  d0,d4       ;d4 = file handle
  42.         beq     xlm2
  43.         move.l  d4,d1
  44.         moveq   #0,d2
  45.         moveq   #1,d3       ;OFFSET_END
  46.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_END)
  47.         move.l  d4,d1
  48.         moveq   #-1,d3      ;OFFSET_BEGINNING
  49.         jsr     -$42(a6)    ;Seek(fh,0,OFFSET_BEGINNING)
  50.         move.l  d0,d5       ;d5 = file size
  51.         movea.l 4,a6
  52.         moveq   #2,d1       ;get chip mem
  53.         jsr     -$c6(a6)    ;AllocMem()
  54.         tst.l   d0
  55.         beq.s   xlm3
  56.         move.l  d0,a2       ;a2 = pointer to module
  57.         move.l  d4,d1   ;file
  58.         move.l  d0,d2   ;buffer
  59.         move.l  d5,d3   ;length
  60.         move.l  a3,a6
  61.         jsr     -$2a(a6)    ;Read()
  62.         cmp.l   d5,d0
  63.         bne.s   xlm4        ;something wrong...
  64.         cmp.l   #'MMD2',(a2)    ;Pro V5 module?
  65.         beq.s   id_ok
  66.         cmp.l   #'MMD1',(a2)    ;Pro module?
  67.         beq.s   id_ok
  68.         cmp.l   #'MMD0',(a2)
  69.         bne.s   xlm4        ;this is not a module!!!
  70. id_ok       movea.l a2,a0
  71.         bsr.s   _RelocModule
  72.         move.l  a2,d6       ;no error...
  73.         bra.s   xlm3
  74. xlm4        move.l  a2,a1       ;error: free the memory
  75.         move.l  d5,d0
  76.         movea.l 4,a6
  77.         jsr     -$d2(a6)    ;FreeMem()
  78. xlm3        move.l  a3,a6       ;close the file
  79.         move.l  d4,d1
  80.         jsr     -$24(a6)    ;Close(fhandle)
  81. xlm2        move.l  a3,a1       ;close dos.library
  82.         movea.l 4,a6
  83.         jsr     -$19e(a6)
  84. xlm1        move.l  d6,d0       ;push return value
  85.         movem.l (sp)+,a2-a4/a6/d2-d6    ;restore registers
  86.         rts         ;and exit...
  87. dosname     dc.b    'dos.library',0
  88.  
  89. ;   Function: _RelocModule(a0)
  90. ;   a0 = pointer to module
  91.  
  92. ; This function is a bit strangely arranged around the small reloc-routine.
  93. reloci      move.l  24(a2),d0
  94.         beq.s   xloci
  95.         movea.l d0,a0
  96.         moveq   #0,d0
  97.         move.b  msng_numsamples(a1),d0  ;number of samples
  98.         subq.b  #1,d0
  99. relocs      bsr.s   relocentr
  100.         move.l  -4(a0),d3   ;sample ptr
  101.         beq.s   nosyn
  102.         move.l  d3,a3
  103.         tst.w   4(a3)
  104.         bpl.s   nosyn       ;type >= 0
  105.         move.w  20(a3),d2   ;number of waveforms
  106.         lea 278(a3),a3  ;ptr to wf ptrs
  107.         subq.w  #1,d2
  108. relsyn      add.l   d3,(a3)+
  109.         dbf d2,relsyn
  110. nosyn       dbf     d0,relocs
  111. xloci       rts
  112. norel       addq.l  #4,a0
  113.         rts
  114. relocentr   tst.l   (a0)
  115.         beq.s   norel
  116. ; If you ever happen to need a "delocator", e.g. if you want to save
  117. ; a loaded & relocated module back to disk, simply change the following
  118. ; command to 'sub.l'. However, problems will arise with newer modules
  119. ; that contain fields this locator doesn't know of...
  120.         add.l   d1,(a0)+
  121.         rts
  122. _RelocModule:
  123.         movem.l a2-a3/d2-d3,-(sp)
  124.         movea.l a0,a2
  125.         move.l  a2,d1       ;d1 = ptr to start of module
  126.         bsr.s   relocp
  127.         movea.l mmd_songinfo(a2),a1
  128.         bsr.s   reloci
  129. rel_lp      bsr.s   relocb
  130.         cmp.b   #'2',3(a2)  ;MMD2?
  131.         bne.s   norelmmd2
  132.         bsr.w   relocmmd2sng
  133. norelmmd2   move.l  mmd_expdata(a2),d0  ;extension struct
  134.         beq.s   rel_ex
  135.         move.l  d0,a0
  136.         bsr.s   relocentr   ;ptr to next module
  137.         bsr.s   relocentr   ;InstrExt...
  138.         addq.l  #4,a0       ;skip sizes of InstrExt
  139. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  140. ; read them.
  141.         bsr.s   relocentr   ;annotxt
  142.         addq.l  #4,a0       ;annolen
  143.         bsr.s   relocentr   ;InstrInfo
  144.         addq.l  #8,a0
  145.         bsr.s   relocentr   ;rgbtable (not useful for most people)
  146.         addq.l  #4,a0       ;skip channelsplit
  147.         bsr.s   relocentr   ;NotationInfo
  148.         bsr.s   relocentr   ;songname
  149.         addq.l  #4,a0       ;skip song name length
  150.         bsr.s   relocentr   ;MIDI dumps
  151.         bsr.s   relocmdd
  152.         move.l  d0,a0
  153.         move.l  (a0),d0
  154.         beq.s   rel_ex
  155.         move.l  d0,a2
  156.         bsr.s   relocp
  157.         movea.l 8(a2),a1
  158.         bra.s   rel_lp
  159. rel_ex      movem.l (sp)+,d2-d3/a2-a3
  160.         rts
  161.  
  162. relocp      lea mmd_songinfo(a2),a0
  163.         bsr.s   relocentr
  164.         addq.l  #4,a0
  165.         bsr.s   relocentr
  166.         addq.l  #4,a0
  167.         bsr.s   relocentr
  168.         addq.l  #4,a0
  169.         bra.s   relocentr
  170.  
  171. relocb      move.l  mmd_blockarr(a2),d0
  172.         beq.s   xlocb
  173.         movea.l d0,a0
  174.         move.w  msng_numblocks(a1),d0
  175.         subq.b  #1,d0
  176. rebl        bsr relocentr
  177.         dbf     d0,rebl
  178.         cmp.b   #'T',3(a2)  ;MMD0 (= MCNT)
  179.         beq.s   xlocb
  180.         cmp.b   #'1',3(a2)  ;test MMD type
  181.         bge.s   relocbi
  182. xlocb       rts
  183.  
  184. relocmdd    tst.l   -(a0)
  185.         beq.s   xlocmdd
  186.         movea.l (a0),a0
  187.         move.w  (a0),d0     ;# of msg dumps
  188.         addq.l  #8,a0
  189. mddloop     beq.s   xlocmdd
  190.         bsr relocentr
  191.         bsr.s   relocdmp
  192.         subq.w  #1,d0
  193.         bra.s   mddloop
  194. xlocmdd     rts
  195.  
  196. relocdmp    move.l  -4(a0),d3
  197.         beq.s   xlocdmp
  198.         exg.l   a0,d3       ;save
  199.         addq.l  #4,a0
  200.         bsr relocentr   ;reloc data pointer
  201.         move.l  d3,a0       ;restore
  202. xlocdmp     rts
  203.  
  204. relocbi     move.w  msng_numblocks(a1),d0
  205.         move.l  a0,a3
  206. biloop      subq.w  #1,d0
  207.         bmi.s   xlocdmp
  208.         move.l  -(a3),a0
  209.         addq.l  #4,a0
  210.         bsr relocentr   ;BlockInfo ptr
  211.         tst.l   -(a0)
  212.         beq.s   biloop
  213.         move.l  (a0),a0
  214.         bsr relocentr   ;hldata
  215.         bsr relocentr   ;block name
  216.         bra.s   biloop
  217. ; take care of the new features of MMD2s
  218. relocmmd2sng    move.l  mmd_songinfo(a2),a0
  219.         lea msng_pseqs(a0),a0
  220.         bsr relocentr   ;playseqtable
  221.         bsr relocentr   ;sectiontable
  222.         bsr relocentr   ;trackvols
  223.         move.w  2(a0),d0    ;numpseqs
  224.         move.l  -12(a0),a0  ;get back to playseqtable
  225.         subq.w  #1,d0
  226. psqtblloop  bsr relocentr
  227.         dbf d0,psqtblloop
  228.         rts
  229.  
  230. ;   Function: _UnLoadModule(a0)
  231. ;   a0 = pointer to module
  232. _UnLoadModule:
  233.         move.l  a6,-(sp)
  234.         move.l  a0,d0
  235.         beq.s   xunl
  236.         movea.l 4,a6
  237.         move.l  4(a0),d0
  238.         beq.s   xunl
  239.         movea.l a0,a1
  240.         jsr     -$d2(a6)    ;FreeMem()
  241. xunl        move.l  (sp)+,a6
  242.         rts
  243.  
  244.     END